package com.ww.springboot.boot.algorithm.leetcode2;

/**
 * 描述：
 *
 * 解题思路:
 * 记录当前指针数出现的次数 超过2次算重复
 * 碰到重复的数 左移数加1 这样就能在原数组上 通过坐标该表值
 * 碰到有效值 length加1
 *
 * 官方：
 * 双指针
 * 快慢指针：快指针指向需要检查的数 慢指针指向有效数的前面一个位置 判断快指针的数与慢指针的前两个数是否一样
 * 一样则无效 往前走
 * 不一样则有效 将快指针的数给慢指针 同时快慢指针同时进1
 * @author 🧑 ‍wanwei
 * @since 2025-05-10 15:41
 */
public class B80删除有序数组中的重复项II {

    public static void main(String[] args) {
        int[] nums = new int[]{1,1,1,2,2,3};
        int i = removeDuplicates(nums);
        System.out.println(i);
        for (int j = 0; j < i; j++) {
            System.out.println(nums[j]);
        }
    }


    public static int removeDuplicates(int[] nums) {
        //记录当前数出现次数
        int times = 1;
        //记录当前数
        int num = nums[0];
        //记录新数组长度
        int length = 1;
        //继续需要往左移的位数
        int leftSize = 0;
        for (int i = 1; i < nums.length; i++) {
            if (num == nums[i]) {
                times++;
            } else {
                times = 1;
                num = nums[i];
            }

            if (times > 2) {
                //次数超了 length不能加了 leftSize要加1
                leftSize++;
                continue;
            } else {
                length++;
            }
            //移动到删除元素之后的位置
            if (leftSize > 0) {
                nums[i - leftSize] = nums[i];
            }
        }
        return length;
    }

}
